package com.waitingresult.thread;

import sun.misc.Unsafe;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @Author: WangShuai
 * @CreateTime: 2022-10-30  15:31
 * @Description: TODO
 * @Version: 1.0
 */
public class ReentrantLockDemo {
    public static void main(String[] args) {
        // ReentrantLock在底层都做了什么？

        ReentrantLock lock = new ReentrantLock();
          lock.lock(); // 在底层都做了什么？
    }
    // ReentrantLock 的223行，初始化尝试获取锁
/*    final boolean initialTryLock() {
        //  获取当前线程
        Thread current = Thread.currentThread();
        //  CAS替换 此时用if 只执行一次，如果成功就设置当前线程的独占访问权限
        if (compareAndSetState(0, 1)) { // first attempt is unguarded
            setExclusiveOwnerThread(current);
            return true;
            //  判断 最后一次设置线程的值是不是当前线程， 就记录 state变量+ 1
        } else if (getExclusiveOwnerThread() == current) {
            int c = getState() + 1;
            if (c < 0) // overflow
                throw new Error("Maximum lock count exceeded");
            setState(c);
            return true;
        } else
            return false;
    }*/
    // 总结： ReentrantLock 在初始化的时候 会去尝试获取锁资源， 把表示 设置为当前线程， 如果有其他线程使用了锁， 就返回false


}
